﻿using System;
using System.Collections.Generic;
using System.Text;
using DAL.Properties;
using System.Data.SqlClient;

namespace DAL
{
    public class NProducto:IGenerica<clsProducto>
    {
        #region AMB DE productoES

        /// <summary>
        /// 
        /// </summary>
        /// <returns> DEVUELVE UN LISTADO DE productoES</returns>
        public List<clsProducto> Traer()
        {
            SqlConnection conexion = new SqlConnection();
            SqlCommand comando = new SqlCommand();
            SqlDataReader dr;
            List<clsProducto> Lista = new List<clsProducto>();

            try
            {
                conexion.ConnectionString = Resources.Ruta;
                comando.CommandType = System.Data.CommandType.Text;
                comando.CommandText = "TRAER_PRODUCTOS";
                comando.Connection = conexion;
                conexion.Open();
                dr = comando.ExecuteReader();

                while (dr.Read())
                {
                    clsProducto prod = new clsProducto();

                    prod.IdProducto= dr.GetInt16(0);
                    prod.IdTipoProducto = dr.GetInt16(1);
                    prod.Descripcion = dr.GetString(2);
                    prod.PrecioUnitario = dr.GetDouble(3);
                    prod.Stock= dr.GetInt16(4);
                    prod.Estado = dr.GetBoolean(5);

                    Lista.Add(prod);
                }
                conexion.Close();
                dr.Close();

                return Lista;
            }
            catch (SqlException ex)
            {
                throw new Exception(ex.Message);
            }
            finally
            {
                comando.Dispose();
                conexion.Dispose();
            }
        }

        public clsProducto TraerPorClavePrincipal(short id)
        {
            SqlConnection conexion = new SqlConnection();
            SqlCommand comando = new SqlCommand();
            SqlDataReader dr;
            clsProducto Prod = new clsProducto();

            try
            {
                conexion.ConnectionString = Resources.Ruta;
                comando.CommandType = System.Data.CommandType.Text;
                comando.CommandText = "TRAER_PRODUCTO_X_ID";
                comando.Parameters.Clear();
                comando.Parameters.Add("@id", System.Data.SqlDbType.SmallInt);
                comando.Parameters["@id"].Value = id;
                comando.Connection = conexion;
                conexion.Open();
                dr = comando.ExecuteReader();

                while (dr.Read())
                {
                    Prod.IdProducto = dr.GetInt16(0);
                    Prod.Descripcion = dr.GetString(1);
                }
                conexion.Close();
                dr.Close();

                return Prod;
            }
            catch (Exception)
            {
                throw new Exception("Error al intentar obtener el producto por id.");
            }
            finally
            {
                comando.Dispose();
                conexion.Dispose();
            }
        }

        /// <summary>
        /// 
        /// </summary>
        /// <param name="obj">RECIBE UN OBJETO DEL TIPO PRODUCTO PARA PODER EFECTUAR EL ALTA DEL MISMO,
        /// EN LA DB (SQL SERVER 2008) 
        /// </param>
        public void Insertar(clsProducto obj)
        {
            SqlConnection conexion = new SqlConnection();
            SqlCommand comando = new SqlCommand();

            try
            {
                conexion.ConnectionString = Resources.Ruta;
                comando.CommandType = System.Data.CommandType.StoredProcedure;
                comando.CommandText = "INSERTAR_PRODUCTO";
                comando.Parameters.Clear();
                comando.Parameters.Add("@id", System.Data.SqlDbType.SmallInt);
                comando.Parameters["@id"].Value = obj.IdProducto;
                comando.Parameters.Add("@Prod", System.Data.SqlDbType.VarChar, 30).Value = obj.IdProducto;
                comando.Connection = conexion;
                conexion.Open();
                comando.ExecuteNonQuery();
                conexion.Close();
            }
            catch (Exception)
            {
                throw new Exception("Error al intentar insertar producto.");
            }
            finally
            {
                comando.Dispose();
                conexion.Dispose();
            }
        }

        public void Modicar(clsProducto obj)
        {
            SqlConnection conexion = new SqlConnection();
            SqlCommand comando = new SqlCommand();

            try
            {
                conexion.ConnectionString = Resources.Ruta;
                comando.CommandType = System.Data.CommandType.StoredProcedure;
                comando.CommandText = "MODIFICAR_PRODUCTO";
                comando.Parameters.Clear();
                comando.Parameters.Add("@id", System.Data.SqlDbType.SmallInt);
                comando.Parameters["@id"].Value = obj.IdProducto;
                comando.Parameters.Add("@Prod", System.Data.SqlDbType.VarChar, 30).Value = obj.Descripcion;
                comando.Connection = conexion;
                conexion.Open();
                comando.ExecuteNonQuery();
                conexion.Close();
            }
            catch (Exception)
            {
                throw new Exception("Error al intentar modificar producto.");
            }
            finally
            {
                comando.Dispose();
                conexion.Dispose();
            }
        }

        public void Eliminar(clsProducto obj)
        {
            SqlConnection conexion = new SqlConnection();
            SqlCommand comando = new SqlCommand();

            try
            {
                conexion.ConnectionString = Resources.Ruta;
                comando.CommandType = System.Data.CommandType.StoredProcedure;
                comando.CommandText = "ELIMINAR_PRODUCTO";
                comando.Parameters.Clear();
                comando.Parameters.Add("@id", System.Data.SqlDbType.SmallInt).Value = obj.IdProducto;
                comando.Connection = conexion;
                conexion.Open();
                comando.ExecuteNonQuery();
                conexion.Close();
            }
            catch (Exception ex)
            {
                throw new Exception(ex.Message);
            }
            finally
            {
                comando.Dispose();
                conexion.Dispose();
            }
        }

        #endregion

    }
}
